package top.shiyiri.reflection;

import org.junit.Test;

import java.util.Random;

/**
 * @author Aunean
 * @date 2022/1/12
 */
/*
通过反射创建对应的运行时类的对象
 */
public class NewInstanceTest {

    @Test
    public void test() throws Exception {
        Class<Person> clazz = Person.class;

        /*
        newInstance()：调用此方法，创建对应的运行时类的对象。内部调用运行时类的空参构造器
        要想此方法正常的创建运行时类的对象，要求：
        1.运行时类必须提供空参的构造器
        2.空参的构造器的访问权限能够在其他类中进行访问

        在 JavaBean 中要求提供一个 public 的空参构造器。原因：
        1.便于通过反射，创建运行时类的对象
        2.便于子类继承此运行时类，默认调用 super()，保证父类由此构造器
         */
        Person person = clazz.newInstance();
        System.out.println(person);
    }

    //体会反射的动态性
    @Test
    public void test2() {

        int num = new Random().nextInt(3);//0,1,2
        String classPath = "";
        switch (num) {
            case 0:
                classPath = "java.util.Date";
                break;
            case 1:
                classPath = "java.lang.ArithmeticException";
                break;
            case 2:
                classPath = "top.shiyiri.reflection.Person";
                break;
        }
        try {
            Object instance = getInstance(classPath);
            System.out.println(instance);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /*
    创建一个指定类的对象
    classPath：指定类的全类名
     */
    public Object getInstance(String classPath) throws Exception {
        Class<?> clazz = Class.forName(classPath);
        return clazz.newInstance();
    }
}
